001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-10-4
005 * Time: 16:54:10
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util;
010
011 import EVolve.util.equators.Set;
012
013 import java.util.*;
014
015 public class DataTrace implements Cloneable{
016 private ArrayList trace, stack;
017 private int invocationNum, setSize;
018 private Set currentSet;
019
020 public DataTrace() {
021 trace = new ArrayList();
022 stack = new ArrayList();
023 invocationNum = 0;
024 currentSet = null;
025 }
026
027 public DataTrace(Set workingSet) {
028 currentSet = workingSet;
029 trace = new ArrayList();
030 this.setSize = currentSet.size();
031 trace.add(currentSet);
032 }
033
034 public void updateTrace(long traceId) {
035 if (currentSet.setFull()) {
036 currentSet = currentSet.newSet();
037 trace.add(currentSet);
038 }
039
040 currentSet.addElement(traceId);
041 }
042
043 public ArrayList getCallerChains(int callerId,int calleeId) {
044 ArrayList returnVal = new ArrayList();
045 ArrayList callerChain;
046 int footprint[];
047
048 stack.clear();
049 for (int i = 0; i<trace.size(); i++) {
050 footprint = (int[])trace.get(i);
051
052 if (footprint[1] == 0) {// method exit
053 if (stack.size() != 0) stack.remove(stack.size()-1);
054 }
055 else {
056 stack.add(new Integer(footprint[0]));
057 if ((stack.size()>=2) &&
058 (((Integer)stack.get(stack.size()-1)).intValue() == calleeId) &&
059 (((Integer)stack.get(stack.size()-2)).intValue() == callerId)) {
060 callerChain = (ArrayList)stack.clone();
061 callerChain.remove(callerChain.size()-1);
062 returnVal.add(callerChain);
063 }
064 }
065
066 }
067
068 // remove duplicates
069 ArrayList temp = new ArrayList(), tempReturnVal = new ArrayList();
070 for (int i = 1; i< returnVal.size(); i++) {
071 temp = (ArrayList)returnVal.get(i-1);
072 boolean found = false;
073 for (int j=i; j<returnVal.size(); j++) {
074 callerChain = (ArrayList)returnVal.get(j);
075 if (temp.size() != callerChain.size())
076 continue;
077 for (int k=0; k< temp.size(); k++) {
078 if (((Integer)temp.get(k)).intValue() != ((Integer)callerChain.get(k)).intValue()) {
079 found = false;
080 break;
081 }
082 found = true;
083 }
084 if (found) break;
085 }
086 if (!found)
087 tempReturnVal.add(temp);
088 }
089 if (tempReturnVal.size()>0)
090 returnVal = tempReturnVal;
091 return returnVal;
092 }
093
094 public ArrayList getCallerChain(int callerId, int calleeId) {
095 ArrayList callerChain = new ArrayList();
096 int[] footprint;
097
098 callerChain.add(new Integer(callerId));
099 stack.clear();
100 for (int i = 0; i<trace.size(); i++) {
101 footprint = (int[])trace.get(i);
102
103 if (footprint[1] == 0) { // method exit event
104 if (stack.size() != 0) stack.remove(stack.size()-1);
105 } else {
106 stack.add(new Integer(footprint[0]));
107 if ((stack.size()>=2) &&
108 (((Integer)stack.get(stack.size()-1)).intValue() == calleeId) &&
109 (((Integer)stack.get(stack.size()-2)).intValue() == callerId)) {
110 callerChain = (ArrayList)stack.clone();
111 callerChain.remove(callerChain.size()-1);
112 break;
113 }
114 }
115 }
116
117 return callerChain;
118 }
119
120 public ArrayList getCallees(int callerId, int calleeId) {
121 ArrayList callees = new ArrayList();
122 int footprint[],i;
123
124 stack.clear();
125 for (i = 0; i<trace.size(); i++) {
126 footprint = (int[])trace.get(i);
127
128 if (footprint[1] == 0) { // method exit event
129 if (stack.size() != 0) stack.remove(stack.size()-1);
130 } else {
131 stack.add(new Integer(footprint[0]));
132 if ((stack.size()>=3) &&
133 (((Integer)stack.get(stack.size()-2)).intValue() == calleeId) &&
134 (((Integer)stack.get(stack.size()-3)).intValue() == callerId)) {
135 callees.add(new Integer(footprint[0]));
136 }
137 }
138 }
139
140 // remove duplicates
141 ArrayList temp = new ArrayList();
142 for (i=0; i<callees.size();i++) {
143 int value = ((Integer)callees.get(i)).intValue();
144 boolean found = false;
145 if (i==0) {
146 temp.add(new Integer(value));
147 continue;
148 }
149 for (int j=0; j<temp.size();j++) {
150 if (value == ((Integer)temp.get(j)).intValue()) {
151 found = true;
152 break;
153 }
154 }
155 if (!found)
156 temp.add(new Integer(value));
157 }
158 callees = temp;
159 return callees;
160 }
161
162 public int size() {
163 return trace.size();
164 }
165
166 public ArrayList getTrace() {
167 return trace;
168 }
169
170 public Object clone() {
171 DataTrace o = null;
172 try {
173 o = (DataTrace)super.clone();
174 } catch (CloneNotSupportedException e) {
175 e.printStackTrace();
176 return null;
177 }
178 o.trace = (trace == null) ? null :(ArrayList)trace.clone();
179 o.stack = (stack == null)? null : (ArrayList)stack.clone();
180 o.currentSet = (currentSet == null) ? null : (Set)currentSet.clone();
181 return o;
182 }
183 }